package xkp.lesson2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestMethod {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		//1、通过反射获取成员方法，并调用
		Class class1 = Class.forName("xkp.lesson1.Person");
		//2 获取成员方法
		//2.1、获取所有的公有成员方法
		System.out.println("***********获取所有的公有成员方法**********");
		Method[] methods = class1.getMethods();
		for(Method method:methods) {
			System.out.println(method);
		}
		
		//2.2 获取所有的成员方法，包括私有
		System.out.println("***********获取所有的成员方法，包括私有**********");
		Method[] methods2 = class1.getDeclaredMethods();
		for(Method method:methods2) {
			System.out.println(method);
		}
		
		//2.3 获取指定的成员方法
		System.out.println("**********获取指定的成员方法**********");
		Method method = class1.getMethod("fun1", String.class);
		System.out.println(method);
		//此时method是成员方法，成员方法要依赖对象
		//所以必要要先有对象
		//可以使用构造方法创建一个对象
		Constructor constructor = class1.getConstructor(null);
		Object obj = constructor.newInstance(null);
		//执行obj中的method方法，method的参数是"张三"
		method.invoke(obj, "张三");
		//...其他按步骤对应
		
		//2.4 调用私有的成员方法
		System.out.println("**********获取指定的成员方法**********");
		
		Method method2 = class1.getDeclaredMethod("show4", int.class);
		System.out.println(method2);
		method2.setAccessible(true);
		//如果方法带返回值，则可以直接获取返回值
		String str = (String) method2.invoke(obj, 10);
		System.out.println(str);
	}

}
